<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>

    <style>

    </style>
</head>

<script>


    /* 
        - 如果throw一个对象, 则返回的promise状态是rejected, 值为被抛出的对象
        - 如果return的是任意非promise类型的对象, 则返回的promise状态是resolved, 值为被return的对象
        - 如果return的是一个promise对象, 则返回的promise的状态由return的promise决定, 值为return的promise的值
    */


    // throw一个对象, 则返回的promise状态是rejected, 值为被抛出的对象
    var p1 = Promise.resolve(1)
        .then(  // then()方法会返回一个新的promise对象
            value => {
                throw 4
            }
        )
    
    p1.then(
        value => console.log('状态为fulfilled值为', value),
        reason => console.log('状态为rejected值为', reason) // 状态为rejected值为 4
    )
        




    // 如果return的是任意非promise类型的对象, 则返回的promise状态是resolved, 值为被return的对象
    var p2 = Promise.resolve(1)
        .then(  // then()方法会返回一个新的promise对象
            value => {
                return 1
            }
        )
    
    p2.then(
        value => console.log('状态为fulfilled值为', value), // 状态为fulfilled值为 1
        reason => console.log('状态为rejected值为', reason)
    )


    var p3 = Promise.resolve(1)
        .then(  // then()方法会返回一个新的promise对象
            value => {
                return null
            }
        )
    
    p3.then(
        value => console.log('状态为fulfilled值为', value), // 状态为fulfilled值为 null
        reason => console.log('状态为rejected值为', reason)
    )



    

    // 如果return的是一个promise对象, 则返回的promise的状态由return的promise决定, 值为return的promise的值
    var p4 = Promise.resolve(1)
        .then(  // then()方法会返回一个新的promise对象
            value => {
                return Promise.resolve(`${value}_from_then`)
            }
        )
    
    p4.then(
        value => console.log('状态为fulfilled值为', value), // 状态为fulfilled值为 1_from_then
        reason => console.log('状态为rejected值为', reason)
    )



    var p5 = Promise.resolve(false)
        .then(  // then()方法会返回一个新的promise对象
            value => {
                return Promise.reject(`${value}_from_then`)
            }
        )
    
    p5.then(
        value => console.log('状态为fulfilled值为', value),
        reason => console.log('状态为rejected值为', reason) // 状态为rejected值为 false_from_then
    )


    // 综合示例
    Promise.resolve(1)
    .then(
        value => console.log('then 1')
    )
    .then(
        value => {
            console.log('then 2')
            return '不会中断后面的return执行'
        }
    )
    .then(
        value => {
            console.log('then 3')
            console.log('在成功回调中接收上一个then()的return值', value)    // '在成功回调中接收上一个then()的return值 不会中断后面的return执行
            throw 4
        }
    )
    .then(
        value => console.log('then 4'),
        reason => {
            console.log('在失败回调中接收上一个then()的return值', reason) // '在失败回调中接收上一个then()的return值 4'
            return Promise.reject(`${reason}_in_then`)
        }
    )
    .catch(
        reason => console.log('接收到上一个then()返回的结果', reason)
    )

</script>

<body>

</body>

</html>